package com.lucifer.d.security.data.model;

import com.lucifer.d.security.data.enums.DataCompletionEnum;
import com.lucifer.d.security.data.enums.DataPremiseEnum;
import com.lucifer.d.security.data.enums.DataTransferEnum;
import com.lucifer.d.security.data.enums.DataTypeEnum;
import lombok.Data;

import java.lang.annotation.Annotation;
import java.util.List;

/**
 * @author Lucifer
 * 自动填装配置，其中属性均为黑盒用户信息属性
 * @create 2023 - 08 - 11 12:31
 */
@Data
public class DataCompletionModel {

    /**
     * 类型（1；方法填装；2：属性填装；3：独立填装）
     */
    private Integer type;

    /**
     * 注入标识注解
     */
    private Class<Annotation> anno;

    /**
     * 填充前提
     */
    private String premise;

    /**
     * 指定填充黑盒（sign/user）
     */
    private String transferType;

    /**
     * 属性名（属性填装用）
     */
    private String column;

    /**
     * 方法执行类（方法填装/独立填装用）
     */
    private Class methodClass;

    /**
     * 方法名（方法填装/独立填装用）
     */
    private String methodName;

    /**
     * 方法参数类型（方法填装/独立填装用）（顺序填写）
     */
    private Class[] methodColumn;

    /**
     * 方法参数对应用户属性（方法填装用）（对应方法参数类型顺序填写）
     */
    private String[] methodProperty;

    /**
     * 方法参数对应属性值（独立填装用）
     */
    private Object[] methodValue;

    /**
     * 方法返回类型（独立填装用）
     */
    private Integer valueType;

    /**
     * 是否静态方法声明
     */
    private Boolean isStatic = false;

    public DataCompletionModel(DataCompletionEnum dataCompletionEnum) {
        this.type = dataCompletionEnum.type;
    }

    public DataCompletionModel(Class anno, DataPremiseEnum premise, DataTransferEnum transferType, String column, DataTypeEnum valueType) {
        this.type = DataCompletionEnum.MODEL.type;
        this.anno = anno;
        this.premise = premise.type;
        this.transferType = transferType.type;
        this.column = column;
        this.valueType = valueType.type;
    }

    public DataCompletionModel(DataCompletionEnum dataCompletionEnum, Class anno, DataPremiseEnum premise, Class methodClass,
                               String methodName, Class[] methodColumn, Object[] methodValue, DataTypeEnum valueType, Boolean isStatic) {
        this.type = dataCompletionEnum.type;
        this.anno = anno;
        this.premise = premise.type;
        this.methodClass = methodClass;
        this.methodName = methodName;
        this.methodColumn = methodColumn;
        if (dataCompletionEnum.type.equals(DataCompletionEnum.METHOD.type)){
            this.methodProperty = (String[]) methodValue;
        } else if (dataCompletionEnum.type.equals(DataCompletionEnum.OWN.type)) {
            this.methodValue = methodValue;
        }
        this.valueType = valueType.type;
        this.isStatic = isStatic;
    }

}
